package com.thread.lesson.proxystatic;

/**
 * @Author: Mr.Xi
 * @Description:
 * @Date: Create in 11:32 2021/7/1
 * @Modified By:
 */

/**
 * 1、静态代理模式总结：
 * 真实对象和代理对象都要实现同一个接口
 * 代理对象要代理真实角色
 *
 *2、好处：
 * 代理对象可以做很多真实对象做不了的事情
 * 真实对象专注做自己的事情
 *
 */
public class StaticProxy {
    public static void main(String[] args) {

        //线程写法：
        new Thread(() -> System.out.println("我爱你")).start();


        //静态代理简单写法：
        new WeddingCompany(new You()).happyMarry();

        //静态代理复杂写法：
        //WeddingCompany weddingCompany = new WeddingCompany(new You());
        //weddingCompany.happyMarry();
    }
}

/**
 * 结婚接口
 */
interface Marry{
    /**
     * 人间四大喜事：
     * 1.久旱逢甘露
     * 2.他乡遇故知
     * 3.洞房花烛夜
     * 4.金榜题名时
     */
    void happyMarry();
}

/**
 * 你实现结婚接口类（真实角色）
 */
class You implements Marry{
    @Override
    public void happyMarry() {
        System.out.println("要结婚了，超开心！");
    }
}

/**
 *婚庆公司实现结婚接口类（代理角色）
 */
class WeddingCompany implements Marry{
    //代理谁 ---》 真实目标角色
    private Marry target;//目标对象

    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void happyMarry() {
        before();
        this.target.happyMarry();
        after();
    }

    /**
     * 结婚之前需要干的事情
     */
    private void before() {
        System.out.println("结婚之前，布置现场");
    }

    /**
     * 结婚之后需要干的事情
     */
    private void after() {
        System.out.println("结婚之后，收尾款");
    }
}